home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / sbin / python-updater < prev    next >
Text File  |  2005-10-18  |  9KB  |  323 lines

  1. #!/bin/sh
  2. #
  3. # A bit of hackery to update everything that is humanly possible
  4. # that maybe related to an older version of python. This script can
  5. # be run as many times as you like. It will log the results in
  6. # /tmp/python-updater.log
  7. #
  8. # OLD_PY_VER      = old python version we are upgrading from
  9. # NEW_PY_VER      = new python version we are upgrading to
  10. # PKGS_EXCEPTIONS = packages that should NOT be re-emerged for any reason
  11. # PKGS_MANUAL     = packages that should be re-emerged even if they don't
  12. #                   fit the criteria (eg. ones that have python compiled
  13. #                   statically) - FIXME
  14. #
  15. # Runtime Variables:
  16. # PKGS_TO_REMERGE = list of packages we deem to need re-emerging
  17. # PKGS_OK         = list of packages that should be merged without any problems
  18. # PKGS_MISSING    = list of packages that are installed, but cannot be merged
  19. #                   because they have been pruned from portage
  20. # PKGS_MASKED     = list of packages that are installed, but masked.
  21. #
  22.  
  23. NEW_PY_VER=$(python -V 2>&1 | sed 's:Python ::' | cut -d. -f1-2)
  24.  
  25. PKGS_EXCEPTIONS="dev-lang/python sys-apps/portage"
  26. PKGS_MANUAL="app-office/gnumeric app-office/dia x11-libs/vte"
  27. LOGFILE="/var/log/python-updater.log"
  28.  
  29. # portage variables
  30. PKG_DBDIR=/var/db/pkg
  31. PORTDIR=`portageq portdir`
  32. PORTDIR_OVERLAYS=`portageq portdir_overlay`
  33.  
  34. PRETEND=0
  35. PKGS_TO_REMERGE=""
  36. PKGS_COUNT_REMERGE=0
  37. PORTAGE_PYTHON="/usr/bin/python"
  38.  
  39. # load the gentoo-style info macros, but hack to get around
  40. # it thinking this is an rc script
  41. EBUILD="1" 
  42. source /sbin/functions.sh
  43.  
  44.  
  45.  
  46. for old in 2.4 2.3 2.2 2.1; do
  47.     if [ "${old}" != "${NEW_PY_VER}" ]; then
  48.         if [ -e /usr/bin/python${old} ] ; then
  49.             OLD_PY_VER=${old}
  50.             break;
  51.         fi
  52.     fi
  53. done
  54.  
  55.  
  56. if [ -z "${OLD_PY_VER}" ] ; then
  57.     eerror "Can't determine any previous Python version(s)."
  58.     exit 1
  59. fi
  60.  
  61.  
  62. # misc helper functions
  63. eloginfo() {
  64.     einfo $*
  65.     DATESTRING=`date +"%Y/%m/%d %H:%M:%S"`
  66.     echo "${DATESTRING} - ${*}" >> ${LOGFILE}
  67. }
  68.  
  69. elogecho() {
  70.     echo -n "   "
  71.     echo $*
  72.     DATESTRING=`date +"%Y/%m/%d %H:%M:%S"`
  73.     echo "${DATESTRING} - ${*}" >> ${LOGFILE}
  74. }
  75.  
  76. elogerr() {
  77.     eerror $*
  78.     DATESTRING=`date +"%Y/%m/%d %H:%M:%S"`
  79.     echo "${DATESTRING} ! ${*}" >> ${LOGFILE} 
  80. }
  81.  
  82. elog() {
  83.     DATESTRING=`date +"%Y/%m/%d %H:%M:%S"`
  84.     echo "${DATESTRING} - ${*}" >> ${LOGFILE}
  85. }
  86.  
  87.  
  88. usage() {
  89.     echo "usage: python-updater [-h|-p|-o X.X|-n X.X]"
  90.     echo " -h      help"
  91.     echo " -p      pretend (don't do anything)"
  92.     echo " -o X.X  set old python version to upgrade from [default: ${OLD_PY_VER}]"
  93.     echo " -n X.X  set new python version to upgrade to [default: ${NEW_PY_VER}]"
  94. }
  95.  
  96. #
  97. # Sanity check
  98. #
  99.  
  100. if [ -z "${PORTDIR}" ]; then
  101.     eerror "Unable to proceed. Can not find PORTDIR. Make sure the command:"
  102.     eerror " "
  103.     eerror "  portageq portdir"
  104.     eerror " "
  105.     eerror "returns a value. If it doesn't, make sure you have updated to"
  106.     eerror "latest portage version."
  107.     eerror " "
  108.     eerror "Report bugs to http://bugs.gentoo.org/"
  109.     exit 1
  110. fi    
  111.  
  112. if [ ! -f ${LOGFILE} ]; then
  113.     if ! touch ${LOGFILE} 2>&1 > /dev/null; then
  114.         ewarn "Logging disabled due to permissions"
  115.         LOGFILE=/dev/null
  116.     fi
  117. elif [ ! -w ${LOGFILE} -o ! -L ${LOGFILE} ]; then
  118.     ewarn "Logging disabled due to permissions"
  119.     LOGFILE=/dev/null
  120. fi
  121.  
  122. #
  123. # Command Line Parsing
  124. #
  125. #
  126. while [ -n "$1" ]; do
  127.     case "$1" in
  128.         -h)
  129.             usage
  130.             exit 0
  131.             ;;
  132.         -p)
  133.             PRETEND=1
  134.             ;;
  135.         -o)
  136.             shift
  137.             OLD_PY_VER="$1"
  138.             ;;
  139.         -n)
  140.             shift
  141.             NEW_PY_VER="$1"
  142.             ;;
  143.         *)
  144.             usage
  145.             echo "unrecognised option: $1"
  146.             ;;
  147.     esac
  148.     shift
  149. done
  150.  
  151. #
  152. # Test where portage is, in python2.2 or somewhere else?
  153. #
  154. for py in /usr/bin/python /usr/bin/python${OLD_PY_VER} /usr/bin/python${NEW_PY_VER}; do
  155.     if ${py} -c "import portage"; then
  156.         PORTAGE_PYTHON=${py}
  157.         break;
  158.     fi
  159. done
  160.  
  161. #
  162. #
  163. # Find all packages that have installed something in 
  164. # /usr/lib/python${OLD_PY_VER}
  165. #
  166. #
  167. OLD_MODULES_DIRS="/usr/lib/python${OLD_PY_VER} /usr/lib32/python${OLD_PY_VER} /usr/lib64/python${OLD_PY_VER}"
  168. OLD_INCLUDE_DIR=/usr/include/python${OLD_PY_VER}
  169.  
  170. eloginfo "Starting Python Updater from ${OLD_PY_VER} to ${NEW_PY_VER} :"
  171. eloginfo "Searching for packages with files in ${OLD_MODULES_DIRS} .."
  172.  
  173. # iterate thru all the installed package's contents
  174. for content in `find ${PKG_DBDIR} -name CONTENTS`; do
  175.     # extract the category, package name and package version
  176.     CATPKGVER=$(echo ${content} | sed "s:${PKG_DBDIR}/\(.*\)/CONTENTS:\1:")
  177.     
  178.     # exclude packages that are an exception, like portage and python itself.
  179.     exception=0
  180.     for exp in ${PKGS_EXCEPTIONS}; do
  181.         if [ -n "$(echo ${CATPKGVER} | grep ${exp})" ]; then
  182.             exception=1
  183.             break;
  184.         fi
  185.     done
  186.     
  187.     if [ ${exception} = 1 ]; then
  188.        continue;
  189.     fi
  190.  
  191.     for OLD_MODULES_DIR in ${OLD_MODULES_DIRS}; do
  192.         if fgrep "${OLD_MODULES_DIR}" ${content} > /dev/null; then
  193.             PKGS_TO_REMERGE="${PKGS_TO_REMERGE} ${CATPKGVER}"
  194.         elogecho "Adding to list: ${CATPKGVER}"
  195.     elif fgrep "${OLD_INCLUDE_DIR}" ${content} > /dev/null; then
  196.             PKGS_TO_REMERGE="${PKGS_TO_REMERGE} ${CATPKGVER}"
  197.         fi
  198.     done
  199. done    
  200.  
  201. # now we have to do each emerge seperately because if an installed version
  202. # does not have the corresponding ebuild in portage, then it will bail.
  203.  
  204. eloginfo "Calculating Upgrade Package List .."
  205.  
  206. PKGS_OK=""
  207. PKGS_MASKED=""
  208. PKGS_MISSING=""
  209.  
  210. MASKED_STRING="been masked"
  211. MISSING_STRING="there are no masked or unmasked ebuilds to satisfy"
  212.  
  213. for pkg in ${PKGS_TO_REMERGE}; do
  214.    emerge_output="$(emerge -p \=$pkg 2>&1)"
  215.    if $(echo "${emerge_output}" | grep "${MASKED_STRING}" > /dev/null); then
  216.       PKGS_MASKED="${PKGS_MASKED} $pkg"
  217.       elogecho "$pkg is masked"      
  218.    elif $(echo "${emerge_output}" | grep "${MISSING_STRING}" > /dev/null); then
  219.       PKGS_MISSING="${PKGS_MISSING} $pkg"
  220.       elogecho "$pkg is missing from portage"
  221.    else
  222.       PKGS_OK="${PKGS_OK} $pkg"
  223.       PKGS_COUNT_REMERGE=$((PKGS_COUNT_REMERGE + 1))
  224.    fi
  225. done      
  226.  
  227. #
  228. # Use my super dumb package reordering algorithm that works most of the time
  229. #
  230.  
  231. eloginfo "Re-ordering packages to merge .."
  232.  
  233. PKGS_OK_SORTED="$(${PORTAGE_PYTHON} ${PORTDIR}/dev-lang/python/files/depreorder.py ${PKGS_OK} | xargs)"
  234.  
  235. eloginfo "Preparing to merge these packages in this order:"
  236. for pkg in $PKGS_OK_SORTED; do
  237.     elogecho "$pkg"
  238. done
  239.  
  240. # we emerge each package seperately to ensure we know exactly which ones might
  241. # cause an error, and then report it at the end
  242.  
  243. COUNT=1
  244. PKGS_FAILED=""
  245. if [ "${PRETEND}" != "1" ]; then
  246.     for pkg in ${PKGS_OK_SORTED}; do
  247.         eloginfo "Starting to merge ($COUNT/$PKGS_COUNT_REMERGE) $pkg .."
  248.         if ! emerge --oneshot --nodeps =$pkg; then
  249.             PKGS_FAILED="${PKGS_FAILED} $pkg"
  250.             elogerr "Failed merging $pkg ($COUNT/$PKGS_COUNT_REMERGE)!"
  251.         fi
  252.         COUNT=$((COUNT+1))        
  253.     done
  254. fi
  255.  
  256. # final output stuff
  257. OUTPUT_PKGS_MASKED=""
  258. for pkg in ${PKGS_MASKED}; do OUTPUT_PKGS_MASKED="${OUTPUT_PKGS_MASKED} \=$pkg"; done
  259. OUTPUT_PKGS_MISSING=""
  260. for pkg in ${PKGS_MISSING}; do OUTPUT_PKGS_MISSING="${OUTPUT_PKGS_MISSING} $pkg"; done
  261. OUTPUT_PKGS_FAILED=""
  262. for pkg in ${PKGS_FAILED}; do OUTPUT_PKGS_FAILED="${OUTPUT_PKGS_FAILED} \=$pkg"; done
  263.  
  264. if [ -n "${PKGS_FAILED}" -o -n "${PKGS_MISSING}" -o -n "${PKGS_MASKED}" ]; then
  265.    echo
  266.    ewarn "************************************************************"
  267.    ewarn "* Packages that still need to be manually emerged :        *"
  268.    ewarn "************************************************************"
  269.    if [ -n "${OUTPUT_PKGS_MASKED}" ]; then
  270.       echo
  271.       ewarn " Masked Packages:"
  272.       ewarn " ----------------"
  273.       ewarn " Unmask the following packages (at your own risk) and  "
  274.       ewarn " emerge them using this command after removing the '-p'"
  275.       ewarn " parameter."
  276.       echo
  277.       ewarn " emerge -p ${OUTPUT_PKGS_MASKED}"
  278.       echo
  279.    fi
  280.    if [ -n "${OUTPUT_PKGS_MISSING}" ]; then
  281.       echo
  282.       ewarn " Missing Packages:"
  283.       ewarn " -----------------"
  284.       ewarn " These packages need to be updated because their versions do"
  285.       ewarn " not exist in portage anymore."
  286.       echo
  287.       for x in ${OUTPUT_PKGS_MISSING}; do 
  288.          echo "   ${x}"
  289.       done
  290.    fi
  291.    if [ -n "${OUTPUT_PKGS_FAILED}" ]; then
  292.       echo
  293.       ewarn " Failed Packaged:"
  294.       ewarn " ----------------"
  295.       ewarn " These packages have failed and need to be re-emerged again."
  296.       ewarn " Alternatively, try re-running this script again to see if it"
  297.       ewarn " can be fixed."
  298.       echo
  299.       ewarn " emerge -p ${OUTPUT_PKGS_FAILED}"
  300.       echo
  301.    fi
  302.    
  303.    elog "Python update completed with errors."
  304.    elog "Masked Packages:"
  305.    for x in ${PKGS_MASKED}; do
  306.            elog $x
  307.    done
  308.    elog "Missing Packages:"
  309.    for x in ${PKGS_MISSING}; do
  310.            elog $x
  311.    done
  312.    elog "Failed Packages:"
  313.    for x in ${PKGS_FAILED}; do
  314.            elog $x
  315.    done   
  316.    elog "Update script completed."
  317. else
  318.    eloginfo "Python update completed successfully."
  319. fi
  320.  
  321.